﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using KProject.Model;
using KProject.DAL;
using KProject.View;
using System.Windows.Forms;

namespace KProject.Controller
{
    class GruposJuradosController
    {
        private List<Jurado> jurados = new List<Jurado>();
        private List<GrupoJurados> gruposJurados = new List<GrupoJurados>();

        public void Atualizar(DataGridView gridGrupos,
                              ListBox lbJuradosInseridos,
                              ListBox lbJuradosNaoInseridos,
                              Button bGrupoInserirTudo,
                              Button bGrupoInserirSelecionado,
                              Button bGrupoRemoverTudo,
                              Button bGrupoRemoverSelecionado,
                              Button bUpJurado,
                              Button bDownJurado,
                              int idConcurso,
                              TabControl tabControl)
        {
            jurados = JuradosDAL.List(idConcurso);
            gruposJurados = GruposJuradosDAL.List(idConcurso);

            if (jurados.Count > 0)
            {
                lbJuradosNaoInseridos.DataSource = jurados;
                lbJuradosInseridos.DataSource = new List<Jurado>();
                bGrupoInserirTudo.Enabled = true;
                bGrupoInserirSelecionado.Enabled = true;
                bGrupoRemoverTudo.Enabled = false;
                bGrupoRemoverSelecionado.Enabled = false;
                bUpJurado.Enabled = false;
                bDownJurado.Enabled = false;
            }
            else
            {
                tabControl.SelectedIndex = 0;
                throw new VerifyingException("Nenhum jurado cadastrado.");
            }

            gridGrupos.AutoGenerateColumns = false;

            BindingSource bs = new BindingSource();
            gridGrupos.DataSource = bs;
            bs.DataSource = gruposJurados;
        }

        public void AdicionarTodosJurados(ListBox lb1,
                                          ListBox lb2,
                                          Button bTudo1,
                                          Button bSelecionado1,
                                          Button bTudo2,
                                          Button bSelecionado2,
                                          Button bUpJurado,
                                          Button bDownJurado,
                                          bool inserir)
        {
            List<Jurado> list1 = new List<Jurado>();
            List<Jurado> list2 = new List<Jurado>();

            for (int i = 0; i < lb1.Items.Count; i++)
            {
                list1.Add((Jurado)lb1.Items[i]);
            }

            for (int i = 0; i < lb2.Items.Count; i++)
            {
                list1.Add((Jurado)lb2.Items[i]);
            }

            bSelecionado1.Enabled = false;
            bTudo1.Enabled = false;
            bSelecionado2.Enabled = true;
            bTudo2.Enabled = true;

            lb1.DataSource = null;
            lb2.DataSource = null;
            lb1.DataSource = list1;
            lb2.DataSource = list2;
            lb1.DisplayMember = "Nome";
            lb2.DisplayMember = "Nome";
        }

        public void AdicionarJuradosSelecionados(ListBox lb1,
                                                 ListBox lb2,
                                                 Button bTudo1,
                                                 Button bSelecionado1,
                                                 Button bTudo2,
                                                 Button bSelecionado2,
                                                 Button bUpJurado,
                                                 Button bDownJurado,
                                                 bool inserir)
        {
            
            List<Jurado> list1 = new List<Jurado>();
            List<Jurado> list2 = new List<Jurado>();

            for (int i = 0; i < lb1.Items.Count; i++)
            {
                list1.Add((Jurado)lb1.Items[i]);
            }

            for (int i = 0; i < lb2.Items.Count; i++)
            {
                list2.Add((Jurado)lb2.Items[i]);
            }

            for (int i = 0; i < lb2.SelectedItems.Count; i++)
            {
                list1.Add((Jurado)lb2.SelectedItems[i]);
                list2.Remove((Jurado)lb2.SelectedItems[i]);
            }

            if (list1.Count > 0)
            {
                bSelecionado2.Enabled = true;
                bTudo2.Enabled = true;
            }
            else
            {
                bSelecionado2.Enabled = false;
                bTudo2.Enabled = false;
            }

            if (list2.Count > 0)
            {
                bSelecionado1.Enabled = true;
                bTudo1.Enabled = true;
            }
            else
            {
                bSelecionado1.Enabled = false;
                bTudo1.Enabled = false;
            }

            lb1.DataSource = null;
            lb2.DataSource = null;
            lb1.DataSource = list1;
            lb2.DataSource = list2;
            lb1.DisplayMember = "Nome";
            lb2.DisplayMember = "Nome";
        }

        public void Inserir(TextBox tbNomeGrupo,
                            ListBox lbJuradosNaoInseridos,
                            ListBox lbJuradosInseridos,
                            Button bGrupoInserirTudo,
                            Button bGrupoInserirSelecionado,
                            Button bGrupoRemoverTudo,
                            Button bGrupoRemoverSelecionado,
                            Button bGrupoInserir,
                            Button bGrupoLimpar,
                            Button bGrupoSalvar,
                            Button bGrupoRemover,
                            Button bGrupoCancelar,
                            DataGridView gridGrupos,
                            Button bUpJurado,
                            Button bDownJurado,
                            int idConcurso)
        {
            Verificar(tbNomeGrupo, lbJuradosInseridos);

            List<Jurado> juradosInseridos = new List<Jurado>();

            for (int i = 0; i < lbJuradosInseridos.Items.Count; i++)
            {
                juradosInseridos.Add((Jurado)lbJuradosInseridos.Items[i]);
            }

            GrupoJurados grupoJurados = new GrupoJurados() { Nome = tbNomeGrupo.Text, Jurados = juradosInseridos };

            grupoJurados.Id = GruposJuradosDAL.Insert(grupoJurados.Nome, grupoJurados.Jurados, idConcurso);

            gruposJurados.Add(grupoJurados);
            BindingSource bs = new BindingSource();
            gridGrupos.DataSource = bs;
            bs.DataSource = gruposJurados;

            Cancelar(tbNomeGrupo, lbJuradosNaoInseridos, lbJuradosInseridos, bGrupoInserirTudo, bGrupoInserirSelecionado, bGrupoRemoverTudo, bGrupoRemoverSelecionado, bGrupoInserir, bGrupoLimpar, bGrupoSalvar, bGrupoRemover, bGrupoCancelar, bUpJurado, bDownJurado);
        }

        public void Salvar(TextBox tbNomeGrupo,
                           ListBox lbJuradosNaoInseridos,
                           ListBox lbJuradosInseridos,
                           Button bGrupoInserirTudo,
                           Button bGrupoInserirSelecionado,
                           Button bGrupoRemoverTudo,
                           Button bGrupoRemoverSelecionado,
                           Button bGrupoInserir,
                           Button bGrupoLimpar,
                           Button bGrupoSalvar,
                           Button bGrupoRemover,
                           Button bGrupoCancelar,
                           DataGridView gridGrupos,
                           Button bUpJurado,
                           Button bDownJurado)
        {
            Verificar(tbNomeGrupo, lbJuradosInseridos);

            int index = gridGrupos.SelectedCells[0].RowIndex;
                
            gruposJurados[index].Nome = tbNomeGrupo.Text;
            gruposJurados[index].Jurados = new List<Jurado>();

            for (int i = 0; i < lbJuradosInseridos.Items.Count; i++)
            {
                gruposJurados[index].Jurados.Add((Jurado)lbJuradosInseridos.Items[i]);
            }

            GruposJuradosDAL.Save(gruposJurados[index].Id, gruposJurados[index].Nome, gruposJurados[index].Jurados);

            BindingSource bs = new BindingSource();
            gridGrupos.DataSource = bs;
            bs.DataSource = gruposJurados;

            Cancelar(tbNomeGrupo, lbJuradosNaoInseridos, lbJuradosInseridos, bGrupoInserirTudo, bGrupoInserirSelecionado, bGrupoRemoverTudo, bGrupoRemoverSelecionado, bGrupoInserir, bGrupoLimpar, bGrupoSalvar, bGrupoRemover, bGrupoCancelar, bUpJurado, bDownJurado);
        }

        private void Verificar(TextBox tbNomeGrupo, ListBox lbJuradosInseridos)
        {
            if (tbNomeGrupo.Text == null || tbNomeGrupo.Text.Trim().Length < 1)
            {
                throw new VerifyingException("Insira o nome do Grupo.");
            }

            if (lbJuradosInseridos.Items.Count < 1)
            {
                throw new VerifyingException("Insira pelo menos um Jurado.");
            }
        }

        public void Limpar(TextBox tbNomeGrupo,
                           ListBox lbJuradosNaoInseridos,
                           ListBox lbJuradosInseridos,
                           Button bGrupoInserirTudo,
                           Button bGrupoInserirSelecionado,
                           Button bGrupoRemoverTudo,
                           Button bGrupoRemoverSelecionado,
                           Button bUpJurado,
                           Button bDownJurado)
        {
            tbNomeGrupo.Text = null;

            lbJuradosNaoInseridos.DataSource = null;
            lbJuradosNaoInseridos.DataSource = jurados;
            lbJuradosNaoInseridos.DisplayMember = "Nome";

            lbJuradosInseridos.DataSource = null;
            lbJuradosInseridos.DataSource = new List<Jurado>();
            lbJuradosInseridos.DisplayMember = "Nome";

            bGrupoInserirTudo.Enabled = true;
            bGrupoInserirSelecionado.Enabled = true;
            bGrupoRemoverTudo.Enabled = false;
            bGrupoRemoverSelecionado.Enabled = false;

            bUpJurado.Enabled = false;
            bDownJurado.Enabled = false;
        }

        public void CarregarDados(DataGridView gridGrupos,
                                  TextBox tbNomeGrupo,
                                  Button bGrupoInserir,
                                  Button bGrupoLimpar,
                                  Button bGrupoSalvar,
                                  Button bGrupoRemover,
                                  Button bGrupoCancelar,
                                  ListBox lbJuradosNaoInseridos,
                                  ListBox lbJuradosInseridos,
                                  Button bUpJurado,
                                  Button bDownJurado)
        {
            if (gridGrupos.SelectedCells.Count > 0)
            {
                tbNomeGrupo.Text = gridGrupos.SelectedCells[0].Value.ToString();
                bGrupoInserir.Visible = false;
                bGrupoLimpar.Visible = false;
                bGrupoSalvar.Visible = true;
                bGrupoRemover.Visible = true;
                bGrupoCancelar.Visible = true;

                List<Jurado> juradosInseridos = gruposJurados[gridGrupos.SelectedCells[0].RowIndex].Jurados;
                List<Jurado> juradosNaoInseridos = new List<Jurado>();
                juradosNaoInseridos.AddRange(jurados);

                for (int i = 0; i < juradosInseridos.Count; i++)
                {
                    juradosNaoInseridos.Remove(juradosInseridos[i]);
                }

                lbJuradosInseridos.DataSource = null;
                lbJuradosNaoInseridos.DataSource = null;
                lbJuradosInseridos.DataSource = juradosInseridos;
                lbJuradosNaoInseridos.DataSource = juradosNaoInseridos;
                lbJuradosInseridos.DisplayMember = "Nome";
                lbJuradosNaoInseridos.DisplayMember = "Nome";

                VerificarUpDown(lbJuradosInseridos, bUpJurado, bDownJurado);
            }
        }

        public void Cancelar(TextBox tbNomeGrupo,
                             ListBox lbJuradosNaoInseridos,
                             ListBox lbJuradosInseridos,
                             Button bGrupoInserirTudo,
                             Button bGrupoInserirSelecionado,
                             Button bGrupoRemoverTudo,
                             Button bGrupoRemoverSelecionado,
                             Button bGrupoInserir,
                             Button bGrupoLimpar,
                             Button bGrupoSalvar,
                             Button bGrupoRemover,
                             Button bGrupoCancelar,
                             Button bUpJurado,
                             Button bDownJurado)
        {
            bGrupoInserir.Visible = true;
            bGrupoLimpar.Visible = true;
            bGrupoSalvar.Visible = false;
            bGrupoRemover.Visible = false;
            bGrupoCancelar.Visible = false;

            Limpar(tbNomeGrupo, lbJuradosNaoInseridos, lbJuradosInseridos, bGrupoInserirTudo, bGrupoInserirSelecionado, bGrupoRemoverTudo, bGrupoRemoverSelecionado, bUpJurado, bDownJurado);
        }

        public void Remover(DataGridView gridGrupos,
                            TextBox tbNomeGrupo,
                            ListBox lbJuradosNaoInseridos,
                            ListBox lbJuradosInseridos,
                            Button bGrupoInserirTudo,
                            Button bGrupoInserirSelecionado,
                            Button bGrupoRemoverTudo,
                            Button bGrupoRemoverSelecionado,
                            Button bGrupoInserir,
                            Button bGrupoLimpar,
                            Button bGrupoSalvar,
                            Button bGrupoRemover,
                            Button bGrupoCancelar,
                            Button bUpJurado,
                            Button bDownJurado)
        {
            if (gridGrupos.SelectedCells.Count == 1)
            {
                int index = gridGrupos.SelectedCells[0].RowIndex;
                string nome = gridGrupos.SelectedCells[0].Value.ToString();

                // verificar a possibilidade de deleção
                int categorias = GruposJuradosDAL.VerifyCategoria(gruposJurados[index].Id);

                if (categorias > 0)
                {
                    StringBuilder confirmMsg = new StringBuilder();
                    confirmMsg.Append("Deseja remover ");
                    confirmMsg.Append("\"");
                    confirmMsg.Append(nome);
                    confirmMsg.Append("\" ");
                    confirmMsg.Append("da lista de grupos de jurados?");

                    DialogResult dialogResult = MessageBox.Show(confirmMsg.ToString(), "Remover", MessageBoxButtons.YesNo);
                    if (dialogResult == DialogResult.Yes)
                    {
                        GruposJuradosDAL.Remove(gruposJurados[index].Id);
                        gruposJurados.RemoveAt(index);

                        BindingSource bs = new BindingSource();
                        gridGrupos.DataSource = bs;
                        bs.DataSource = gruposJurados;
                    }

                    Cancelar(tbNomeGrupo, lbJuradosNaoInseridos, lbJuradosInseridos, bGrupoInserirTudo, bGrupoInserirSelecionado, bGrupoRemoverTudo, bGrupoRemoverSelecionado, bGrupoInserir, bGrupoLimpar, bGrupoSalvar, bGrupoRemover, bGrupoCancelar, bUpJurado, bDownJurado);
                }
                else
                {
                    throw new VerifyingException("Existe(m) "+ categorias +" categoria(s) com referência a este grupo de jurados. Altere as referências antes de removê-lo.");
                }
            }
            else
            {
                throw new VerifyingException("Selecione um grupo de jurados.");
            }
        }

        public void VerificarUpDown(ListBox lbJuradosInseridos, Button bUpJurado, Button bDownJurado)
        {
            bUpJurado.Enabled = false;
            bDownJurado.Enabled = false;

            if (lbJuradosInseridos.Items.Count > 0)
            {
                if (lbJuradosInseridos.SelectedIndex > 0)
                    bUpJurado.Enabled = true;
                if (lbJuradosInseridos.SelectedIndex < lbJuradosInseridos.Items.Count - 1)
                    bDownJurado.Enabled = true;
            }
        }

        public void JuradoMove(ListBox lbJuradosInseridos, Button bUpJurado, Button bDownJurado, int move)
        {
            List<Jurado> juradosInseridos = new List<Jurado>();

            for (int i = 0; i < lbJuradosInseridos.Items.Count; i++)
            {
                juradosInseridos.Add((Jurado)lbJuradosInseridos.Items[i]);
            }

            Jurado jurado = (Jurado) lbJuradosInseridos.SelectedItem;

            int index = lbJuradosInseridos.SelectedIndex;
            juradosInseridos[index] = juradosInseridos[index + move];
            juradosInseridos[index + move] = jurado;

            lbJuradosInseridos.DataSource = null;
            lbJuradosInseridos.DataSource = juradosInseridos;
            lbJuradosInseridos.DisplayMember = "Nome";
            lbJuradosInseridos.SelectedIndices.Clear();
            lbJuradosInseridos.SelectedIndex = index + move;

            VerificarUpDown(lbJuradosInseridos, bUpJurado, bDownJurado);
        }
    }
}
